package com.chat.common.user.dao;

import com.chat.common.common.domain.vo.req.CursorPageBaseReq;
import com.chat.common.common.domain.vo.resp.CursorPageBaseResp;
import com.chat.common.common.utils.CursorUtils;
import com.chat.common.user.domain.entity.UserFriend;
import com.chat.common.user.mapper.UserFriendMapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * <p>
 * 用户联系人表 服务实现类
 * </p>
 *
 * @author <a href="https://www.linxin.cc">lin</a>
 * @since 2024-09-20
 */
@Service
public class UserFriendDao extends ServiceImpl<UserFriendMapper, UserFriend> {

    /**
     * 查询自己的用户列表 也就是以 uid作为过滤条件
     * @param uid
     * @param req
     */
    public CursorPageBaseResp<UserFriend> getFriendPage(Long uid, CursorPageBaseReq req) {
//        LambdaQueryChainWrapper<UserFriend> wrapper = lambdaQuery();
//        //游标字段 (快速定位索引位置)
//        wrapper.lt(UserFriend::getId,req.getCursor());
//        //游标方向 倒序
//        wrapper.orderByDesc(UserFriend::getId);
//        //查询自己的好友 以uid 作为过滤条件
//        wrapper.eq(UserFriend::getUid,uid);
//        Page<UserFriend> page = page(req.plusPage(), wrapper);
//        //计算游标的位置
//        String cursor = Optional.ofNullable(CollectionUtil.getLast(page.getRecords()))
//                .map(UserFriend::getId)
//                .map(String::valueOf)
//                .orElse(null);
//        //是否是最后一页
//        boolean isLast = page.getRecords().size()!=req.getPageSize();
//
//        return new CursorPageBaseResp<>(cursor,isLast,page.getRecords());

        return CursorUtils.getCursorPageBase(this, req,
                wrapper -> wrapper.eq(UserFriend::getUid, uid), UserFriend::getId);

    }

    public List<UserFriend> getByFriends(Long uid, List<Long> uidList) {
        return lambdaQuery().eq(UserFriend::getUid, uid)
                .in(UserFriend::getUid, uidList)
                .list();
    }

    public UserFriend getByFriend(Long uid, Long targetUid) {
        return lambdaQuery().eq(UserFriend::getUid, uid)
                .eq(UserFriend::getId, targetUid)
                .one();
    }

    public List<UserFriend> getUserFriend(Long uid, Long friendUid) {
        return lambdaQuery().eq(UserFriend::getUid, uid)
                .eq(UserFriend::getFriendUid, friendUid)
                .select(UserFriend::getId)
                .or()
                .eq(UserFriend::getUid, friendUid)
                .eq(UserFriend::getFriendUid, uid)
                .select(UserFriend::getId)
                .list();
    }
}
